// 创建用户相关的小仓库
import { defineStore } from 'pinia'
// 引入接口
import { reqLogin, reqUserInfo, reqLogout } from '@/api/user'
import type { loginFormData, loginResponseData, userInfoResponseData } from "@/api/user/type"
import type { UserState } from './types/type'
// 引入操作本地存储的工具方法
import { TOKEN_SET, TOKEN_GET, TOKEN_REMOVE } from '@/utils/token'
// 引入路由(常量路由)
import { constantRoute, asyncRoute, anyRoute } from '@/router/routers'
import router from '@/router'
// 引入深拷贝方法
// @ts-ignore
import cloneDeep from 'lodash/cloneDeep'
// 用于过滤当前用户需要展示的异步路由
const filterAsyncRoute = (asyncRoute: any, routes: any) => {
   return asyncRoute.filter((item: any) => {
      if (routes.includes(item.name)) {
         if (item.children && item.children.length > 0) {
            item.children = filterAsyncRoute(item.children, routes)
         }
         return true
      }
   })
}
let useUserStore = defineStore('User', {
   // 存储数据
   state: (): UserState => {
      return {
         token: TOKEN_GET(),   //用户的唯一标识token
         menuRoutes: constantRoute, //仓库存储生成菜单需要的数组
         username: '',   //用户名
         avatar: '',     //用户头像
         buttons: []    //存储当前用户是否包含某一个按钮
      }
   },
   // 异步|逻辑的地方
   actions: {
      // 用户登录的方法
      async userLogin(data: loginFormData) {
         let result: loginResponseData = await reqLogin(data)
         // console.log(result)
         // 登录成功200->token
         // 登录失败201->登录失败错误的信息
         if (result.code == 200) {
            this.token = result.data
            // 本地持久化存储
            TOKEN_SET(result.data)
            // 能保证当前async函数返回一个成功的promise
            return 'ok'
         } else {
            return Promise.reject(new Error(result.data))
         }
      },
      // 获取用户信息的方法
      async userInfo() {
         // 获取用户的头像和名字进行存储
         let result: userInfoResponseData = await reqUserInfo()
         // 如果获取信息成功，存储用户信息
         if (result.code == 200) {
            this.username = result.data.name
            this.avatar = result.data.avatar
            this.buttons = result.data.buttons
            // 根据用户信息动态筛选异步路由
            let userAsyncRoute = filterAsyncRoute(cloneDeep(asyncRoute), result.data.routes)
            // 菜单的数据整理完毕
            this.menuRoutes = [...constantRoute, ...userAsyncRoute, ...anyRoute]
            // 将动态路由和任意路由进行动态的追加
            let newRoutes = [...userAsyncRoute, ...anyRoute]
            newRoutes.forEach(route => {
               router.addRoute(route)
            })
            return 'ok'
         } else {
            return Promise.reject(new Error(result.message))
         }
      },
      // 用户退出登录
      async userLogOut() {
         let result: any = await reqLogout()
         if (result.code == 200) {
            // 目前没有退出登录接口(通知服务器token失效)
            // 仓库和本地存储相关数据清空
            this.token = ''
            this.username = ''
            this.avatar = ''
            TOKEN_REMOVE()
            return 'ok'
         } else {
            return Promise.reject(new Error(result.message))
         }
      }
   },
   getters: {

   }
})


// 对外暴露获取小仓库的方法
export default useUserStore